关于node 您所在的位置:网站首页 javascript redis 关于node

关于node

2024-01-17 04:11| 来源: 网络整理| 查看: 265

按现在大多数在node上使用redis去查询Redis里所有键,都是使用的keys这个命令

redisClient.keys("key",callback)

但是,redis官方其实不推荐使用keys这个命令来获取所有的键值,官网是这样描述的: keys针对大型数据库执行时,可能会破坏性能,此命令只用于调试和特殊操作。其实不难理解,redis是单线程处理用户的命令,而keys命令会一次遍历所有的key,在执行过程中是无法执行其他命令的。这就导致key比较多的时候key命令执行时间会比较的长,从而堵塞redis。 官方推荐了sets和scan两个命令去执行。因为这次存储全部使用的String类型存储,sets方法只能用于set类型,所以只能用scan。 scan会分次进行遍历,不会堵塞线程,提供了一个count参数来控制每次遍历的集合数,可以理解为是一种渐进式的keys。 然而scan的这个方法基本没看到有人使用,node_redis的官方文档永远就讲get、set这两个api,找不到相关参数。于是乎在外网找到了scan的用法

redisClient.scan(cursor,"MATCH","pattern",'COUNT',"10000",callback) ursor - 游标。pattern - 匹配的模式。count - 指定每次遍历多少个集合。 可以简单理解为每次遍历多少个元素根据测试,推荐 Count大小为 1W

这个count值比较的重要,这个值如果过于小了反而会导致scan执行特别慢,太大了可能又会导致redis堵塞时间长,和key没啥区别了,所以这个值得根据数据库中的数据数量来设置,不过有人测试过scan count值理想的大小为10000。 在这里插入图片描述 明白了scan的参数和原理,接下来该谈谈如何去使用scan来执行查询。 因为设置了10000这个值,所以每次遍历只会遍历出10000个结果,如果你的数据库键的数量小于10000个值,可能就会全部输出出来,但是如果超过了可能得到的结果就不是全部的了,无论如何你都无法保证count 值超过你数据库里存放的键的数量。

scan方法考虑到这一点,所以在查询的结果会返回一个key,这个key值是一个数组,数组[1]是查询到全部键,数组[0]就是查询返回的游标值。如果key等于0的话就等于查询结束,如果还未结束,这个key做为游标就表示hash遍历的最后一个值,我们需要将这个值重新传回给scan作为cursor继续进行查询。

首先我们需要定一个变量cursor设置为0

const cursor = 0

然后设置好scan方法和回调

redisClient.scan(cursor,"MATCH",type,'COUNT',"10000",(err,key)=>{ if(err){ throw err } })

在回调中将key赋值给变量cursor,并判断cursor是否为0

function scan(res){ redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{ if(err){ throw err } cursor = key[0] if(cursor === '0'){ } }) }

如果游标为零,将结果存储起来,如果不为0就返回函数方法。

function scan(res){ redisClient.scan(cursor,"MATCH","user_info:username:*",'COUNT',"10000",(err,key)=>{ if(err){ throw err } cursor = key[0] if(cursor === '0'){ keyarr.push(...key[1]) }else{ if(key[1].length !== 0){ keyarr.push(...key[1]) } return scan(res) } }) }

这样子就可以将数据库中的所有键值遍历并保存下来了。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有